package com.travel.travelnetwork.security;


import com.travel.travelnetwork.service.AdminService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;



@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig  extends WebSecurityConfigurerAdapter {
    protected void configure(HttpSecurity http) throws Exception {
        // 自定义表单登录
        http.formLogin()
                .loginPage("/back/admin_login") // 自定义登录页面
                .usernameParameter("username") // 用户名项
                .passwordParameter("password") // 密码项
                .loginProcessingUrl("/back/admin/login") // 表单提交路径
                .successForwardUrl("/back/admin_index") // 登录成功页面
                .failureForwardUrl("/back/admin_fail"); // 登录失败页面
        // 权限拦截配置
        http.authorizeRequests()
                .antMatchers("/back/admin/login").permitAll() // 登录不需要认证
                .antMatchers("/back/admin_fail").permitAll()// 登录失败不需要认证
                .antMatchers("/back/admin_login").permitAll()// 登录页不需要认证
                .antMatchers("/**/*.css","/**/*.js","/static/*/*.*").permitAll() // 放行静态资源
                .antMatchers("/back/**").authenticated();// 其余都需要认证

        // 退出登录配置
        http.logout()
                .logoutUrl("/back/admin/logout") // 退出登录路径
                .logoutSuccessUrl("/back/admin_login") // 退出登录成功后跳转的页面
                .clearAuthentication(true) // 退出成功后清除认证信息
                .invalidateHttpSession(true); // 退出成功后清除session

        // 异常处理
        http.exceptionHandling()
                .accessDeniedHandler(new MyAccessDeniedHandler()); //权限不足处理器

        // 关闭csrf防护
        http.csrf().disable();
        // 开启跨域访问
        http.cors();
    }
    // 3. 配置「密码加密器」：Spring Security 强制要求密码加密，不能明文存储
    @Bean
    public PasswordEncoder passwordEncoder() {
        // 使用 BCrypt 加密算法（主流选择，安全性高）
        return new BCryptPasswordEncoder();
    }
}
